package com.aizuda.boot.modules.business.counterparty.service;

import com.aizuda.boot.modules.business.contract.dto.SingleResponse;
import com.aizuda.boot.modules.business.counterparty.entity.CounterpartyInfoEntity;
import com.aizuda.boot.modules.business.counterparty.entity.dto.CounterpartyQueryReqDTO;
import com.aizuda.boot.modules.business.counterparty.entity.dto.CreateCounterpartyReqDTO;
import com.aizuda.boot.modules.business.counterparty.entity.dto.ExportDTO;
import com.aizuda.boot.modules.business.counterparty.entity.dto.UpdateCounterpartyReqDTO;
import com.aizuda.boot.modules.business.counterparty.entity.vo.ChangeRecordVO;
import com.aizuda.boot.modules.business.counterparty.entity.vo.CounterpartyPageRespDTO;
import com.aizuda.boot.modules.business.counterparty.entity.vo.CounterpartyVO;
import com.aizuda.boot.modules.business.counterparty.entity.vo.CreateCounterpartyRespDTO;
import com.baomidou.mybatisplus.extension.service.IService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 交易方服务接口
 */
public interface CounterpartyService extends IService<CounterpartyInfoEntity> {

    /**
     * 获取所有启用的交易方列表
     *
     * @return 启用的交易方列表
     */
    List<CounterpartyInfoEntity> getEnabledCounterparties();

    /**
     * 根据ID获取交易方（包含停用的）
     *
     * @param id 交易方ID
     * @return 交易方信息
     */
    CounterpartyInfoEntity getCounterpartyById(Integer id);

    /**
     * 启用/停用交易方
     *
     * @param id      交易方ID
     * @param enabled 是否启用
     * @return 是否成功
     */
    boolean toggleCounterpartyStatus(Integer id, Boolean enabled);

    /**
     * 分页查询交易方列表
     *
     * @param reqDTO 查询请求参数
     * @return 分页结果
     */
    CounterpartyPageRespDTO queryCounterpartiesPage(CounterpartyQueryReqDTO reqDTO);

    /**
     * 新增交易方
     *
     * @param reqDTO 新增请求参数
     * @return 新增结果
     */
    CreateCounterpartyRespDTO createCounterparty(CreateCounterpartyReqDTO reqDTO, HttpServletRequest request);

    /**
     * 检查交易方唯一性
     *
     * @param counterpartyName   交易方名称
     * @param registerCountry    注册国家代码
     * @param counterpartyNature 交易方性质
     * @return true-唯一(不存在), false-不唯一(已存在)
     */
    boolean checkCounterpartyUniqueness(String counterpartyName, String registerCountry, Integer counterpartyNature);


    /**
     * 修改交易方
     *
     * @param reqDTO 修改请求参数
     * @return 修改结果
     */
    Boolean updateCounterparty(@Valid UpdateCounterpartyReqDTO reqDTO, HttpServletRequest request);

    /**
     * 获取交易方详情
     *
     * @param counterpartyId
     * @return
     */
    List<ChangeRecordVO> queryChangeRecords(Integer counterpartyId);

    /**
     * 上传文件更新交易方
     *
     * @param file
     * @return
     */
    SingleResponse<Boolean> uploadCounterparty(MultipartFile file);

    /**
     * 获取交易方列表
     *
     * @return
     */
    List<CounterpartyVO> getCounterpartyList();

    /**
     * 获取交易方详情
     *
     * @param certificateId
     * @return
     */
    CounterpartyPageRespDTO.CounterpartyItemDTO getInfo(String certificateId);

    /**
     * 删除交易方
     * @param counterpartyId
     * @return
     */
    Boolean deleteCounterparty(Integer counterpartyId);

    /**
     * 导出交易方
     * @param dto
     * @param response
     */
    void exportCounterparty(ExportDTO dto, HttpServletResponse response);
}